﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Configuration;

namespace Ausy.Survey.Common.Providers
{
    /// <summary>
    /// Cette classe permet de créer une couche d'accès aux données pour la création d'un utilisateur
    /// </summary>
    public abstract class BaseDataProvider
    {
        #region Const

        /// <summary>
        /// Nom de la connexion à la base de données à utiliser
        /// </summary>
        private const string CONNECTION_NAME = "DefaultConnectionString";

        #endregion

        #region ConnectionStringSettings Property

        /// <summary>
        /// Configuration de la chaine de connexion a la base de données
        /// </summary>
        public ConnectionStringSettings ConnectionStringSettings { get; private set; }

        #endregion

        #region DbFactory Property

        /// <summary>
        /// Factory permettant de créer les objets ADO .NET
        /// </summary>
        public DbProviderFactory DbFactory { get; private set; }

        #endregion

        #region Constructor

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        public BaseDataProvider()
        {
            this.ConnectionStringSettings = ConfigurationManager.ConnectionStrings[CONNECTION_NAME];
            this.DbFactory = DbProviderFactories.GetFactory(this.ConnectionStringSettings.ProviderName); // SqlClient
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// Cette méthode permet de créer une connexion à la base de données 
        /// </summary>
        /// <returns>Une connexion SQL</returns>
        public DbConnection CreateConnection()
        {
            var connection = this.DbFactory.CreateConnection();
            connection.ConnectionString = this.ConnectionStringSettings.ConnectionString;
            return connection;
        }

        /// <summary>
        /// Cette méthode permet de créer une commande 
        /// </summary>
        /// <param name="connection">Connection</param>
        /// <param name="text">requete SQL, nom de la procédure stockée</param>
        /// <returns>Une commande SQL</returns>
        public DbCommand CreateCommand(DbConnection connection, String text)
        {
            var command = this.DbFactory.CreateCommand();
            command.CommandType = CommandType.StoredProcedure;
            command.Connection = connection;
            command.CommandText = text;
            return command;
        }

        /// <summary>
        /// Cette méthode permet de créer un parametre SQL
        /// </summary>
        /// <param name="name">Nom du parameter</param>
        /// <param name="sqlType">type de données</param>
        /// <param name="valueParameter">valeur du parametre</param>
        /// <returns>Parametre SQL</returns>
        public DbParameter CreateParameter(String name, DbType sqlType, object valueParameter)
        {
            var parameter = this.DbFactory.CreateParameter();
            parameter.DbType = sqlType;
            parameter.Direction = ParameterDirection.Input;
            parameter.ParameterName = name;
            parameter.Value = valueParameter;
            return parameter;
        }

        #endregion
    }
}
